package plateau;

import cartes.Carte;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

public class Pioche implements Serializable{

    /*
     * Attribut
     */
    private List<Carte> listeCartes;
    //

    /*
     * Constructeur
     */
    public Pioche() {
        this.listeCartes = new ArrayList<Carte>();
    }
   
    public Pioche( ArrayList<Carte> listeCartes ) {
        this.listeCartes = listeCartes;
    }
    //

    /*
     * Méthodes
     */
    
    /*
     * Méthode permettant de piocher la première Carte de la pile
     * NB : La carte piochée est supprimée de la pioche
     * @return : La Carte de la pioche demandée 
     * @author : Arthur
     */
    public Carte recuperer() {
            int last = this.listeCartes.size()-1;            
            return this.listeCartes.remove(last);
    }

    /*
     * Ajoute une carte à la pioche
     * @param : La Carte à ajouter
     * @author : Arthur
     */
    public void add(Carte c) {
        this.listeCartes.add(c);
    }
    
    /*
     * Vide la pioche
     * Attention : penser à récupérer la liste, sinon les cartes sont perdues
     * @return : La liste des cartes supprimées de la pioche 
     * @author : Arthur
     */
    public List<Carte> vider() {
        List<Carte> l = new ArrayList<Carte>(this.listeCartes);
        this.listeCartes.clear();
        return l;
    }

    /* 
     * Mélange aléatoirement la pioche
     * @author : Arthur
     */
    public void melanger() {
        Collections.shuffle(this.listeCartes);        
    }
    
    /*
     * Hérité de ArrayList - Ajoute un tableau de carte à la pioche
     * @param : L'ensemble des cartes à ajouter (ArrayList implements Collection)
     * @return : true if this list changed as a result of the call.
     * @author : Arthur
     */
    public boolean addAll(Collection<Carte> c) {
        return listeCartes.addAll(c);
    }

    /* 
     * Teste si la pioche est vide.
     * @return : true if this list has no elements; false otherwise.
     */
    public boolean isEmpty() {
        return listeCartes.isEmpty();
    }

    @Override
    public String toString() {
        String out = "==== PIOCHE ====\n";
        for ( Carte c : this.listeCartes ) {
            out += "- " + c.toString() + "\n";
        }
        return out;
    }  
    
    public Carte getFirst( String type ) {
        for( Carte c : this.listeCartes ) {
            if( c.getClass().getName().equals(type)) {
                return c;
            }
        }
        return null;
    }
    
}